package com.shujia.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

public class Demo03KafkaProducerWithTrans {
    public static void main(String[] args) {
        Properties properties = new Properties();
        // Kafka集群的地址
        properties.setProperty("bootstrap.servers", "master:9092,node1:9092,node2:9092");
        // 设置Key及Value的序列化方式
        properties.setProperty("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.setProperty("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.setProperty("transactional.id", "00001");
        KafkaProducer<String, String> producer = new KafkaProducer<>(properties);

        // 使用事务写Kafka
        producer.initTransactions();

        // 开始事务
        producer.beginTransaction();

        // 步骤一：进行CK

        // 步骤二：向Kafka写数据
        // topic如果不存在 会自己创建
        producer.send(new ProducerRecord<String, String>("trans01", "hello1"));
        producer.send(new ProducerRecord<String, String>("trans01", "hello2"));
        producer.send(new ProducerRecord<String, String>("trans01", "hello3"));
        producer.send(new ProducerRecord<String, String>("trans01", "hello4"));

        // 当事务中所有的步骤完成了，就可以提交事务
        /*
         * 默认读未提交的数据，即会读到脏数据
         * kafka-console-consumer.sh --bootstrap-server master:9092 --topic trans01 --from-beginning
         * 读已提交的数据
         * kafka-console-consumer.sh --isolation-level read_committed --bootstrap-server master:9092 --topic trans01 --from-beginning
         */
        // CK以及写Kafka都ok了，则提交事务，
        // 否则都失败，即：要么同时成功，要么同时失败
        producer.commitTransaction(); // 将事务提交，表示事件完成了
        // 将数据从缓冲区刷写到磁盘
        producer.flush();
    }
}
